// C++ Templates 9.2: 模板与inline
// 模板和内联函数(inline functions)在C++中有着密切的关系，特别是在头文件中定义模板时。

// C++有一个基本规则叫做"单一定义规则"(ODR)，它规定：
// 非内联函数在整个程序中只能有一个定义
// 内联函数可以在多个编译单元中有相同的定义

// 9.2.1 模板与内联的关系
// 模板函数的内联性质
// 模板函数不是自动内联的，但它们通常在头文件中定义，这导致了一些混淆：
// header.h
template <typename T>
T add(T a, T b)
{ // 没有inline
    return a + b;
}

// file1.cpp
#include "header.h"
void func1()
{
    add(1, 2); // 实例化add<int>
}

// file2.cpp
#include "header.h"
void func2()
{
    add(1, 2); // 再次实例化add<int>
}

// 问题：
// 1.add<int>在file1.cpp和file2.cpp中都被实例化
// 2.这导致同一个函数add<int>有两个定义
// 3.违反了ODR，可能导致链接错误

// 显式使用inline关键字
// 为了明确意图并避免可能的链接问题，通常建议对头文件中定义的模板函数使用inline关键字：
template <typename T>
inline T add(T a, T b)
{
    return a + b;
}
// inline关键字告诉编译器和链接器：这个函数可以有多个相同的定义
// 链接器会合并这些定义，而不是报错
// 符合ODR规则
